#include <stdio.h>
#include <time.h>
#include <malloc.h>
#include "../ModuleB/Course.h"//new
#include "Student.h"
#include "../ModuleC/Log.h"
#include "../include/Student_pub.h"

void PrintChoice2() {
	printf("*****************************************\n");
	printf("*           学生信息管理            	*\n");
	printf("*****************************************\n");
	printf("1. 添加或录入学生信息\n");
	printf("2. 删除学生信息\n");
	printf("3. 按学号或姓名修改学生信息\n");
	printf("4. 查询全部学生信息\n");
	printf("5. 按学号或姓名查询学生信息\n");
	printf("6. 退出\n");
	printf("------------------------------------------\n");
	printf("请做出一个选择！\n");
}

void StudentManage() {//学生管理主界面
	int num;
	while (1) {
	  	PrintChoice2();
	  	scanf("%d", &num);
	  	switch (num) {
	  	case 1:
	  		AddSImformation();
	  		break;
	  	case 2:
	  		DelSImformation();
	  		break;
	  	case 3:
	  		AlterSImformation();
	  		break;
		case 4:
	  		QuerySImformation1();
	  		break;
		case 5:
	  		QuerySImformation2();
	  		break;  	
	  	case 6:
	  		break;
	  	default:
	  		printf("请输入一个1~6之间的数字！\n"); 
			break;
	  	}
	  	if (num == 6) {
			break;
		}
	}
}

void AddSImformation() {
	int num;
	while (1) {
		printf("*****************************************\n");
		printf("*             添加学生信息          	*\n");
		printf("*****************************************\n");
		printf("1.录入学生信息\n");
		printf("2.新增学生信息\n");
		printf("3.退出\n");
		printf("------------------------------------------\n");
		printf("请做出一个选择！\n");
		scanf("%d",&num);
		switch (num) {
		case 1:
			ReadSImformation();
			break;
		case 2:
			AddSImformationByK();
			break;
		case 3:
			break;
		default: 
			printf("请输入一个1~3之间的数字！\n"); 
			break;
		}
        	if (num == 3) {
			break;
		}
	}
}


void AddSImformationByK() {//添加学生信息
	if (headS == NULL) {
		printf("学生信息还未录入，请先录入学生信息！\n");//new
		return ;
	}
	int i;
	struct Student *p1, *p2;
	p1 = (struct Student *)malloc(sizeof(struct Student));
	printf("请输入学号：\n");
	scanf("%s", p1->SNO);
	p2 = headS;
	while (p2) {
		if (!strcmp(p1->SNO,p2->SNO)) {
			printf("该学生信息已存在，请重新输入！\n");//new
			return ;
		}
		p2 = p2->next;
	}
	printf("请输入学生姓名和选课数量：\n");
	scanf("%s %d", p1->SN, &p1->SCN);
	printf("请输入学生已选课程：\n");
	for (i = 0; i < p1->SCN; i++)
		scanf("%s", p1->SC[i]);
	printf("请输入学生总学分：\n");
	scanf("%lf", &p1->TScore);
	p1->next = headS->next;
	headS->next = p1;
	printf("添加学生信息成功！\n");
	
	FILE *fp1;	
	fp1=fopen("FILE/log.log","a");
	Log(fp1);
	fprintf(fp1,"新增了学号为%s，姓名为%s的学生信息，调用了AddSImformationByK()。\n",p1->SNO, p1->SN);
	fclose(fp1);
}
void AlterSImformation() {//修改学生信息
	int i;
	if (headS == NULL) {
		printf("学生信息还未录入，请先录入学生信息！\n");
		return ;
	}
	char s[15];
	struct Student *p1;
	p1 = headS;
	printf("请输入你要修改的学生的学号或姓名！");
	scanf("%s", s);
	while (strcmp(s, p1->SNO) && strcmp(s, p1->SN) && p1->next) {
		p1 = p1->next;
	}
	if (!strcmp(s, p1->SNO) || !strcmp(s, p1->SN)) {
		printf("请输入你要修改的学生信息！\n"); 
		printf("请输入学号：\n");
		scanf("%s", p1->SNO);
		printf("请输入学生姓名和选课数量：\n");
		scanf("%s %d", p1->SN, &p1->SCN);
		printf("请输入学生已选课程：\n");
		for(i = 0; i < p1->SCN; i++)
			scanf("%s", p1->SC[i]);
		printf("请输入学生总学分：\n");
		scanf("%lf", &p1->TScore);
		printf("修改学生信息成功！\n");	
	} else {
		printf("学生信息不存在，请重新输入！");
		return ; 
	}
	FILE *fp1;	
	fp1=fopen("FILE/log.log","a");
	Log(fp1);
	fprintf(fp1,"修改了%s的学生信息，调用了AlterSImformation()。\n", s);
	fclose(fp1);
}

void DelSImformation() {//删除学生信息
	if (headS == NULL) {
		printf("学生信息还未录入，请先录入学生信息！\n");
		return ;
	}
	char s[15];
	struct Student *p1, *p2;
	p1 = headS;
	printf("请输入你要删除的学生的学号或姓名！");
	scanf("%s", s);
	while (strcmp(s, p1->SNO) && strcmp(s, p1->SN) && p1->next) {
		p2 = p1;
		p1 = p1->next;
	}
	if (!strcmp(s, p1->SNO) || !strcmp(s, p1->SN)) {
		if (p1 == headS) {
			headS = p1->next;
		} else {
			p2->next = p1->next;
		}
		printf("删除学生信息成功！\n");
	} else {
		printf("学生信息不存在，请重新输入！");
		return ;
	}
	printf("已删除该学生信息!\n");
	FILE *fp1;	
	fp1=fopen("FILE/log.log","a");
	Log(fp1);
	fprintf(fp1,"删除了学号为%s，姓名为%s的学生信息，调用了DelSImformation()。\n",p1->SNO, p1->SN);
	fclose(fp1);
}
void QuerySImformation1() {//查询全部学生信息
	if (headS == NULL) {
		printf("学生信息还未录入，请先录入学生信息！\n");
		return ;
	}
	int i;
	struct Student *p1;
	p1 = headS;
	printf("学号\t姓名\t总学分\t已选课程\n");
	while (p1) {
		printf("%s\t%s\t", p1->SNO, p1->SN);
		printf("%.0lf\t", p1->TScore);
		for(i = 0; i < p1->SCN; i++)
			printf("%s ", p1->SC[i]);
		printf("\n");
		if (p1->next) {
			p1 = p1->next;	
		} else {
			break;
		}
	}
	FILE *fp1;	
	fp1=fopen("FILE/log.log","a");
	Log(fp1);
	fprintf(fp1,"查询了所有的学生信息，调用了QuerySImformation1()。\n");
	fclose(fp1);
}
void QuerySImformation2() {//查询单个学生信息
	if (headS == NULL) {
		printf("学生信息还未录入，请先录入学生信息！\n");
		return ;
	}
	int i, flag = 1;
	char s[15];
	struct Student *p1;
	printf("请输入你要查找的学生的学号或姓名！");
	scanf("%s", s); 
	p1 = headS;
	while (p1) {
		if (!strcmp(s, p1->SNO) || !strcmp(s, p1->SN)) {
			flag = 0;
			printf("学号\t学生姓名\t总学分\t已选课程\n");
			printf("%s\t%s\t\t", p1->SNO, p1->SN);
			printf("%.0lf\t", p1->TScore);
			for(i = 0; i < p1->SCN; i++)
				printf("%s ", p1->SC[i]);
			printf("\n");
		}
		if (p1->next) {
			p1 = p1->next;	
		} else {
			break;
		}
	}
	if (flag)
		printf("未查找到该学生信息");
	FILE *fp1;	
	fp1=fopen("FILE/log.log","a");
	Log(fp1);
	fprintf(fp1,"查询了学号为%s，姓名为%s的学生信息，调用了QuerySImformation2()。\n",p1->SNO, p1->SN);
	fclose(fp1);
}
void PreserveS() {//保存学生信息
	if (headS == NULL) {
		printf("学生信息还未录入，请先录入学生信息！\n");
		return ;
	}
	int i;
	FILE *fp;
	char filename[20];
	struct Student *p1;
	printf("请输入保存文件路径及文件名：\n");
	scanf("%s", filename);
	if ((fp = fopen(filename, "w+")) == NULL) {
        printf("打开文件失败！\n"); 
		return ; 
    	}
    	p1 = headS;
    	while (p1) {
    		fprintf(fp, "%s %s %d", p1->SNO, p1->SN, p1->SCN);
		for(i = 0; i < p1->SCN; i++)
			fprintf(fp, " %s", p1->SC[i]);
		fprintf(fp, " %.0lf", p1->TScore);
		if(p1->next)
			fprintf(fp, "\n");
    		p1 = p1->next;
	}
	free(p1);
	free(headS);
	fclose(fp);
	printf("学生信息已保存在%s中!\n",filename);
	FILE *fp1;	
	fp1=fopen("FILE/log.log","a");
	Log(fp1);
	fprintf(fp1,"保存了学生信息，调用了PreserveS()。\n");
	fclose(fp1);
}

